﻿////////////////////////////////////////////////////////////////////////////
// 
// Copyright (C) 2008 e-Channels CORPORATION
// 
// ALL RIGHTS RESERVED BY e-Channels CORPORATION, THIS PROGRAM
// MUST BE USED SOLELY FOR THE PURPOSE FOR WHICH IT WAS  
// FURNISHED BY e-Channels CORPORATION, NO PART OF THIS PROGRAM
// MAY BE REPRODUCED OR DISCLOSED TO OTHERS, IN ANY FORM
// WITHOUT THE PRIOR WRITTEN PERMISSION OF e-Channels CORPORATION.
// USE OF COPYRIGHT NOTICE DOES NOT EVIDENCE PUBLICATION
// OF THE PROGRAM
// 
//			e-Channels CONFIDENTIAL AND PROPRIETARY
// 
////////////////////////////////////////////////////////////////////////////
// 
// $Log: LianaStringFilter.java,v $
// Revision 1.2  2010/10/29 09:29:25  base_dev_guoxiaofeng
// �޸�����
//
// Revision 1.1  2009/07/04 06:51:41  base_dev_fuwei
// ��ʼ�汾
//
// Revision 1.9  2009/06/10 08:56:48  liushj
// ����ź���̳�ṩ�������
//
// Revision 1.8  2009/05/12 06:29:36  liushj
// ½«ˤɫµŗַ�htmlؖ·�ɾ³�
// Revision 1.7  2009/03/16 10:26:45  zhuding
// ͳһ�޸��ļ�����ΪUTF-8
//
// Revision 1.6  2008/12/02 06:39:22  zhanghao
// 重构
//
// Revision 1.5  2008/11/26 06:41:38  liushj
// 增加对空指针处理
//
// Revision 1.4  2008/10/06 02:40:37  zhanghao
// 添加方法recoverHtmlTag
//
// Revision 1.3  2008/07/09 07:20:30  zhanghao
// 重构
//
// Revision 1.2  2008/06/26 06:26:46  zhanghao
// Update
//
// Revision 1.1  2008/06/26 03:14:21  zhanghao
// 初始版本
//
//
package cn.bbs.ba.format;

import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Liana 字符串过滤方法集合类
 * 
 * @version 1.0 2008-06-26
 * @author zhanghao@yuchengtech.com
 */
public class LianaStringFilter {
	/**
	 * 过滤<script>*</script>的正则表达式，不区分大小写
	 */
	private static final Pattern FILTER_SCRIPT = Pattern.compile( "\\<script(.*)/script\\>", Pattern.CASE_INSENSITIVE );
	/**
	 * 过滤<iframe>*</iframe>的正则表达式，不区分大小写
	 */
	private static final Pattern FILTER_IFRAME = Pattern.compile( "\\<iframe(.*)/iframe\\>", Pattern.CASE_INSENSITIVE );

	/**
	 * 将输入的字符串的html字符全部删除<br>
	 * 返回无html标签的原文
	 * 
	 * @param input
	 * @return String
	 */
	public static String deleteHtmlTag( String input )
	{
		if ( input == null )
		{
			return null;
		}
		else
		{
			String result = input
					.replaceAll(
							"(\\[([^=]*)(=[^\\]]*)?\\][\\s\\S]*?\\[/\\1\\])|((?=[^\u4E00-\u9FA5\uFE30-\uFFA0,.\"\");])<a\\s+[^>]*>[^<]{2,}</a>(?=[^\u4E00-\u9FA5\uFE30-\uFFA0,.\"\");]))|(<style[\\s\\S]+?/style>)|(<select[\\s\\S]+?/select>)|(<script[\\s\\S]*?/script>)|(<!--[\\s\\S]*?-->)|(<li(\\s+[^>]+)?>[\\s\\S]*?/li>)|(</?\\s*[^>]+(\\s*[^=>]+?=['\"\"]?[^\"\"']+?['\"\"]?)*?[^\\[<]*>)|(&[a-zA-Z]+;)|(#[a-z0-9]{6})|(\\s+)|(&#\\d+;)",
							"" );
			return result;
		}
	}

	/**
	 * 使用指定的Pattern将字符串进行过滤，替换成指定的内容
	 * 
	 * @param pattern
	 *            正则表达式
	 * @param input
	 *            要过滤的字符串
	 * @param replace
	 *            正则表达式替换后的内容
	 * @return String
	 */
	public static String filterByPattern( Pattern pattern, String input, String replace )
	{
		if ( input == null )
		{
			return null;
		}
		else
		{
			Matcher matcher = pattern.matcher( input );
			return matcher.replaceAll( replace );
		}
	}

	/**
	 * 将输入的字符串的html字符<及>进行过滤<br>
	 * 如<a>过滤后返回"&lt;a&gt;"
	 * 
	 * @param input
	 * @return String
	 */
	public static String filterHtmlTag( String input )
	{
		if ( input == null )
		{
			return null;
		}
		else
		{
			StringBuffer result = new StringBuffer();
			char[] charArray = input.toCharArray();
			int size = charArray.length;
			for ( int i = 0; i < size; i++ )
			{
				char current = charArray[i];
				switch ( current ) {
					case '<' :
						result.append( "&lt;" );
						break;
					case '>' :
						result.append( "&gt;" );
						break;
					case '\'' :
						result.append( "&acute;" );
						break;
					case '"' :
						result.append( "&quot;" );
						break;
					default :
						result.append( current );
						break;
				}
			}
			return result.toString();
		}
	}

//	/**
//	 * 为防止HTML和javascript注入进行字符串过滤
//	 * 
//	 * @param data
//	 */
//	public static void filterHtmlTagFromKeyedCollection( KeyedCollection data )
//	{
//		for ( Iterator iterator = data.keySet().iterator(); iterator.hasNext(); )
//		{
//			String key = (String) iterator.next();
//			Object value = data.get( key );
//			if ( value instanceof String )
//			{
//				String afterFilter = filterHtmlTag( (String) value );
//				data.put( key, afterFilter );
//			}
//			else if ( value instanceof IndexedCollection )
//			{
//				IndexedCollection icoll = (IndexedCollection) value;
//				int size = icoll.size();
//				for ( int i = 0; i < size; i++ )
//				{
//					KeyedCollection kcoll = (KeyedCollection) icoll.get( i );
//					filterHtmlTagFromKeyedCollection( kcoll );
//				}
//			}
//			else if ( value instanceof KeyedCollection )
//			{
//				filterHtmlTagFromKeyedCollection( (KeyedCollection) value );
//			}
//		}
//	}

	/**
	 * 将输入的字符串进行js脚本过滤，如<iframe src="test.htm"></iframe>过滤后返回"&lt;iframe/&gt;"
	 * 
	 * @param input
	 * @return String
	 */
	public static String filterIframe( String input )
	{
		return filterByPattern( FILTER_IFRAME, input, "&lt;iframe/&gt;" );
	}

	/**
	 * 将输入的字符串进行js脚本过滤，如<script>alert(1)</script>过滤后返回"&lt;script/&gt;"
	 * 
	 * @param input
	 * @return String
	 */
	public static String filterScript( String input )
	{
		return filterByPattern( FILTER_SCRIPT, input, "&lt;script/&gt;" );
	}

	/**
	 * 将过滤后的html字符进行恢复，用于显示包含html的内容
	 * 
	 * @param input
	 * @return String
	 */
	public static String recoverHtmlTag( String input )
	{
		if ( input == null )
		{
			return null;
		}
		else
		{
			String result = input.replaceAll( "&lt;", "\\<" ).replaceAll( "&gt;", "\\>" );
			return result;
		}
	}

	/**
	 * 禁用构造函数
	 */
	private LianaStringFilter() {
		// 禁用构造函数
	}
}
